連續介紹了幾天 Postgres 的 SQL 沒辦法輕易辦到的 DuckDB query,我們可以來討論一個 Postgres 也有的強大 function, UNNEST
SELECT unnest(array[1, 2, 3]) as un;
如果我們有一個 array [1, 2, 3],可以使用 unnest 把 array 中的每個元素展開成一個 row
| un |
|---|
| 1 |
| 2 |
| 3 |
這個大家可能都很熟悉,不過當 array 是 2 維以上的 array, 你就沒辦法控制你的 unnest 層數, Postgres 會一口氣 unnest 所有 level
2 dim
SELECT unnest(ARRAY[[1, 2, 3], [4, 5, 6]]) AS un;
| un |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
3 dim
SELECT unnest(ARRAY[
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
]) AS un;
| un |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
DuckDB UNEST 對於多維 nested type 比較像我預期的,只解開一層,你想要多解開幾層必須由第二個參數指定
SELECT unnest(ARRAY[
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
]) AS un;
| un |
|---|
| [[1, 2], [3, 4]] |
| [[5, 6], [7, 8]] |
解開兩層
SELECT unnest(ARRAY[
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
], max_depth := 2) AS un;
| un |
|---|
| [1, 2] |
| [3, 4] |
| [5, 6] |
| [7, 8] |
一口氣封印解除到底
SELECT unnest(ARRAY[
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
], recursive := true) AS un;
| un |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
你比較喜歡 Postgres 的 unnest 行為還是 DuckDB 的 unnest 行為,留言告訴我!!!